package com.xbongbong.paas.service;

import com.xbongbong.paas.pojo.dto.PermissionAppDetailDTO;
import com.xbongbong.paas.pojo.dto.PermissionModuleDetailDTO;
import com.xbongbong.paas.pojo.dto.RoleBatchAddDTO;
import com.xbongbong.paas.pojo.dto.RoleBatchDelDTO;
import com.xbongbong.paas.pojo.dto.UserAddRoleDTO;
import com.xbongbong.paas.pojo.dto.UserDelRoleDTO;
import com.xbongbong.paas.pojo.dto.UserDetailDTO;
import com.xbongbong.paas.pojo.dto.UserFormPermissionDTO;
import com.xbongbong.paas.pojo.dto.UserGetDTO;
import com.xbongbong.paas.pojo.dto.UserInfoDTO;
import com.xbongbong.paas.pojo.dto.UserListDTO;
import com.xbongbong.paas.pojo.vo.RoleAppDetailVO;
import com.xbongbong.paas.pojo.vo.RoleBatchAddVO;
import com.xbongbong.paas.pojo.vo.RoleBatchDelVO;
import com.xbongbong.paas.pojo.vo.RoleModuleDetailVO;
import com.xbongbong.paas.pojo.vo.UserAddRoleVO;
import com.xbongbong.paas.pojo.vo.UserDelRoleVO;
import com.xbongbong.paas.pojo.vo.UserDetailVO;
import com.xbongbong.paas.pojo.vo.UserFormPermissionVO;
import com.xbongbong.paas.pojo.vo.UserGetVO;
import com.xbongbong.paas.pojo.vo.UserInfoVO;
import com.xbongbong.paas.pojo.vo.UserListVO;
import com.xbongbong.paas.pojo.vo.UserMembersVO;
import com.xbongbong.paas.toolbox.exception.XbbException;
import com.xbongbong.paas.toolbox.wrap.BaseDTO;
import com.xbongbong.paas.toolbox.wrap.BaseVO;
import com.xbongbong.paas.toolbox.wrap.UserVO;
import com.xbongbong.pro.permission.pojo.dto.MySetDTO;
import com.xbongbong.pro.permission.pojo.vo.MySetVO;
import com.xbongbong.pro.process.pojo.dto.ProcessUserListDTO;
import com.xbongbong.pro.process.pojo.vo.ProcessUserListVO;
import com.xbongbong.pro.user.pojo.dto.UserAssistAddDTO;
import com.xbongbong.pro.user.pojo.dto.UserAssistDelDTO;
import com.xbongbong.pro.user.pojo.dto.UserAssistUpdateDTO;
import com.xbongbong.pro.user.pojo.dto.UserGetDataPermissionDTO;
import com.xbongbong.pro.user.pojo.dto.UserInfoAuthDTO;
import com.xbongbong.pro.user.pojo.dto.UserLetterListDTO;
import com.xbongbong.pro.user.pojo.dto.UserMaxDataPermissionDTO;
import com.xbongbong.pro.user.pojo.dto.UserMembersAddDTO;
import com.xbongbong.pro.user.pojo.dto.UserMembersGetDTO;
import com.xbongbong.pro.user.pojo.dto.WorkHandoverInfoDTO;
import com.xbongbong.pro.user.pojo.dto.WorkHandoverSaveDTO;
import com.xbongbong.pro.user.pojo.vo.UserAssistAddVO;
import com.xbongbong.pro.user.pojo.vo.UserAssistDelVO;
import com.xbongbong.pro.user.pojo.vo.UserGetDataPermissionVO;
import com.xbongbong.pro.user.pojo.vo.UserLetterListVO;
import com.xbongbong.pro.user.pojo.vo.UserMaxDataPermissionVO;
import com.xbongbong.pro.user.pojo.vo.WorkHandoverInfoVO;
import com.xbongbong.pro.user.pojo.vo.WorkHandoverSaveVO;
import com.xbongbong.pro.user.pojo.vo.WorkHandoverStatusVO;
import com.xbongbong.sys.domain.entity.DepartmentEntity;

import java.util.List;
import java.util.Set;

/**
 * 用户服务逻辑
 *
 * @author kaka
 * @time 2018-8-28
 */
public interface UserService {

    /**
     * 获取用户VO信息，目前用于登录接口
     * @param corpid 公司id
     * @param userId 用户id
     * @param userDetailFlag UserVO中是否返回 Set<DepartmentVO> 和 Set<RoleVO>
     *                       默认不返回该数据，网关调用做权限判断时需要
     * @param paasPermissionsFlag 返回的用户中的 RoleVO 是否需要paasPermissions字段数据，
     *                            默认不返回该数据，网关调用做权限验证时需要
     * @return 用户基本信息
     * @throws XbbException 业务异常
     */
    UserVO getUserVO(String corpid, String userId, boolean userDetailFlag, boolean paasPermissionsFlag) throws XbbException;

    /**
     * 获取用户基本信息
     * @param userInfoDTO 获取用户信息DTO
     * @return 用户基本信息
     * @throws XbbException 业务异常
     */
    UserInfoVO getUserInfo(UserInfoDTO userInfoDTO) throws XbbException;

    /**
     * 获取用户列表
     * @param userListDTO 关联业务DTO
     * @return 用户列表VO
     * @throws XbbException 业务异常
     */
    UserListVO list(UserListDTO userListDTO) throws XbbException;

    /**
     * 已删除人员的查询
     * @param userListDTO
     * @return
     * @throws XbbException
     */
    UserListVO getDisableUserList(UserListDTO userListDTO) throws XbbException;

    /**
     * 批量删除用户角色，多用户，单角色
     * @param roleBatchDelDTO 关联业务DTO
     * @return 关联业务VO
     * @throws XbbException 业务异常
     */
    RoleBatchDelVO roleBatchDel(RoleBatchDelDTO roleBatchDelDTO) throws XbbException;

    /**
     * 批量为用户增加角色，多用户，单角色,角色不能多于5个
     * @param roleBatchAddDTO 关联业务DTO
     * @return 关联业务VO
     * @throws XbbException 业务异常
     */
    RoleBatchAddVO roleBatchAdd(RoleBatchAddDTO roleBatchAddDTO) throws XbbException;

    /**
     * 员工分配角色
     * @param addRoleDTO 关联业务DTO
     * @return 关联业务VO
     * @throws XbbException 业务异常
     */
    UserAddRoleVO addRole(UserAddRoleDTO addRoleDTO) throws XbbException;

    /**
     * 删除员工角色
     * @param delRoleDTO 关联业务DTO
     * @return 关联业务VO
     * @throws XbbException 业务异常
     */
    UserDelRoleVO delRole(UserDelRoleDTO delRoleDTO) throws XbbException;

    /**
     * 获取员工最大数据权限
     * 为2或3时同时返回主管的部门
     * 为4时，即最高数据权限为自定义，则返回助理的部门的员工
     * @param maxDataPermissionDTO 关联业务DTO
     * @return 关联业务VO
     * @throws XbbException 业务异常
     */
    UserMaxDataPermissionVO maxDataPermission(UserMaxDataPermissionDTO maxDataPermissionDTO) throws XbbException, IllegalAccessException, InstantiationException;

    UserGetDataPermissionVO getDataPermission(UserGetDataPermissionDTO userGetDataPermissionDTO) throws XbbException, IllegalAccessException, InstantiationException;

    /**
     * 添加助理部门/员工
     * @param assistAddDTO 关联业务DTO
     * @return 关联业务VO
     * @throws XbbException 业务异常
     */
    UserAssistAddVO addAssist(UserAssistAddDTO assistAddDTO) throws XbbException;

    /**
     * 去除助理部门/员工
     * @param assistDelDTO 关联业务DTO
     * @return 关联业务VO
     * @throws XbbException 业务异常
     */
    UserAssistDelVO delAssist(UserAssistDelDTO assistDelDTO) throws XbbException;

    /**
     * 批量更新助理部门/员工
     * @param assistUpdateDTO 关联业务DTO
     * @return 关联业务VO
     * @throws XbbException 业务异常
     */
    BaseVO updateAssist(UserAssistUpdateDTO assistUpdateDTO) throws XbbException;

    /**
     * 获取用户基本信息
     * @param userGetDTO
     * @return
     * @throws XbbException
     */
    UserGetVO getUserInfoByTargetUserId(UserGetDTO userGetDTO) throws XbbException;

    /**
     * 获取当前登录用户对于某个表单的权限，若用户有多个角色所具有的角色对应该表单的最高权限（数据权限和操作权限）
     * @param userFormPermissionDTO 关联业务DTO
     * @return 关联业务VO
     * @throws XbbException 业务异常
     */
    UserFormPermissionVO getUserFormPermission(UserFormPermissionDTO userFormPermissionDTO) throws XbbException;

    /**
     * 获取当前登录用户对于某个表单的权限，若用户有多个角色所具有的角色对应该表单的最高权限（数据权限和操作权限）
     * 内部调用，非controller调用接口
     * @param corpid 公司id
     * @param userId 用户userId
     * @param appId 应用id
     * @param menuId 菜单id
     * @return 关联业务VO
     * @throws XbbException 业务异常
     */
    UserFormPermissionVO getUserFormPermissionInternal(String corpid, String userId, Long appId, Long menuId) throws XbbException;

    /**
     * 获取当前登录用户对于某个表单的权限，若用户有多个角色所具有的角色对应该表单的最高权限（数据权限和操作权限）
     * @param userVO 登录用户userVO
     * @param appId 应用id
     * @param menuId 菜单id
     * @return 返回 UserFormPermissionVO
     * @throws XbbException 业务异常
     */
    UserFormPermissionVO getUserFormPermission(UserVO userVO, Long appId, Long menuId)  throws XbbException;

    /**
     * 评论艾特的用户列表
     * @param processUserListDTO
     * @return
     * @throws XbbException
     */
    ProcessUserListVO getProcessUserList(ProcessUserListDTO processUserListDTO) throws XbbException;

    /**
     * 获取用户列表树
     * @author 吴峰
     * @date 2019/2/27 15:24
     * @param userLetterListDTO
     * @return com.xbongbong.pro.user.pojo.vo.UserLetterListVO
     * @throws XbbException 业务异常
     */
    UserLetterListVO letterList(UserLetterListDTO userLetterListDTO) throws XbbException;

    /**
     * 获取工作交接基础数据
     * @param handoverInfoDTO 关联业务DTO
     * @return 关联业务VO
     * @throws XbbException 业务异常
     */
    WorkHandoverInfoVO getWorkHandoverInfo(WorkHandoverInfoDTO handoverInfoDTO) throws XbbException;

    /**
     * 进行工作交接
     * @param handoverSaveDTO 关联业务DTO
     * @return 关联业务VO
     * @throws XbbException 业务异常
     */
    WorkHandoverSaveVO workHandoverSave(WorkHandoverSaveDTO handoverSaveDTO) throws XbbException;

    /**
     * 获取员工交接状态
     * @param baseDTO 关联业务DTO
     * @return 关联业务VO
     * @throws XbbException 业务异常
     */
    WorkHandoverStatusVO getWorkHandoverStatus(BaseDTO baseDTO) throws XbbException;

    /**
     * 获取部门id路由对应的部门
     * @param depId 部门id
     * @param departmentList 部门列表
     * @return
     */
    Set<Long> getSubDepIdList(Long depId, List<DepartmentEntity> departmentList);

    /**
     * 移动端 我的-设置 里面可设置项
     * @param mySetDTO
     * @return
     * @throws XbbException
     * 创建时间 2019/5/6 1:54 PM
     * 修改时间 2019/5/6 1:54 PM
     * @author chy
     * @since v1.0
     * @version v1.0
     */
    MySetVO mySet(MySetDTO mySetDTO) throws XbbException;

    /**
     * Description: web端组织架构查看个人权限详情页
     * @return com.xbongbong.paas.pojo.vo.RoleModuleDetailVO
     * @throws XbbException
     * @author 魏荣杰
     * @date 2020/5/12 3:06 下午
     * @since permission-optimize
     */
    RoleModuleDetailVO permissionModuleDetail(PermissionModuleDetailDTO permissionModuleDetailDTO) throws XbbException;

    /**
     * Description: web端组织架构查看个人权限详情页-app的详情
     *
     * @param permissionAppDetailDTO@return com.xbongbong.paas.pojo.vo.RoleAppDetailVO
     * @author 魏荣杰
     * @date 2020/5/13 10:53 上午
     * @since permission-optimize
     */
    RoleAppDetailVO permissionAppDetail(PermissionAppDetailDTO permissionAppDetailDTO) throws XbbException;


    /**
     * 钉钉个人信息授权
     *
     * @param userInfoAuthDTO
     * @author hongxiao
     * @date 2021-10-22 19:34
     * @since
     * @version
     */
    BaseVO userInfoAuth(UserInfoAuthDTO userInfoAuthDTO) throws XbbException;
    /**
     * web端组织架构查看个人详情页
     *
     * @param
     * @throws
     * @return 用户详情信息
     * @author 郝斌
     * @date 2021-09-22 14:09
     * @since
     * @version
     */
    UserDetailVO detail(UserDetailDTO userDetailDTO) throws XbbException;


    /**
     *
     * @Description: 添加团队常用成员
     * @param userMembersAddDTO
     * @return: com.xbongbong.paas.toolbox.wrap.BaseVO
     * @Author: shen.yang
     * @Date: 2022/1/24  10:31
    */
    BaseVO addMembers(UserMembersAddDTO userMembersAddDTO);

    /**
     *
     * @Description: 获取常用团队成员
     * @param userMembersGetDTO
     * @return: com.xbongbong.paas.toolbox.wrap.UserVO
     * @Author: shen.yang
     * @Date: 2022/1/25  9:36
    */
    UserMembersVO getMembers(UserMembersGetDTO userMembersGetDTO) throws XbbException;
}
